/**
 * @description 表单详细数据展示
 */ 
Rsd.define('Rsd.zen.page.FormPage', {
    extend: 'Rsd.container.Page',
    requires: ['Rsd.widget.ModelForm'],
    xtype: 'form-page',
    header:null,
    width:'100%',
    style:{overflow: 'auto'}, 
     /**
     * 
     */
    //readonly:false, 
    layout: {
        type:'vbox',
        align:'start',
        content:'start start'
    },
    /**
     * 
     */
    items: [
        { 
            xtype: 'model-form',
            width:'65%',
            height: 'auto',
            header:null,
            legend:null, 
            //action:'',
            flex:1, 
        },
        { 
            xtype: 'container',
            height: 60,
            width:'100%',
            header:null,
            //margin: '2 2 2 100',
            layout:'hbox',
            visible:false,
            items: [] 
        }, 
        { 
            xtype: 'container',
            header: null,  
            height:'100%',
            width: '30%',
            //margin: '0 2% 0 2%',
            float:true,
            //hidden: true,
            style:{
                position:'absolute',
                right:0
            }
        }
    ],
     /**
     * { 
        width: null,//form表单宽度 
        height: null,//form表单高度
        method:null,//表单提交方式:POST or PUT
        action:null,//优先级排第一,指定form表单action 属性,以submit的方式提交整个表单数据
     * }
     */
    //form:{},
    //right:null,  
     /**
      * @description 表单字段
      */ 
    formFields:[], 
    /**
     * @description 字段 标签宽度,默认90
     */
    labelWidth:90,
    /**
     * @description 数据
     */
    data:null,

    /**
     * @description 优先级排第二
     * @description 过设置saveHandler属性，指定本地js方法,在本地处理
     */
    saveHandler:null,
    /**
     * @description 优先级排第三
     * @description 通过设置serviceName属性，指定服务端API处理提交业务
     */
    saveServiceName:null,
    /**
     * @description 对象模型，用于获取Rsd.data.ModelSchema(集成了模型结构以及对象的CURD操作)对象
     * @description 优先从页面中获取，不存在时，从该页面菜单中获取
     */
    //modelType:'', 
    /**
     * 
     */
    onBeforeSave:null,
    /**
     * 按钮数组
     */
    buttons: ['save', 'delete', 'cancel'],
    /**
     * 
    * */
    constructor: function constructor(config) {
        config = config || {};
        this.apply(config);  
    },
    /**
     * 
     */
    onBeforeInit:function onBeforeInit()
    { 
        //this.items[0].fields = this.formFields;   
        this.callParent();
    },
    /** 
     * 
    */
    onAfterRender:function onAfterRender()
    { 
        this.callParent(); 
        var me = this;  
        if(me.items[0].fields.length > 0)
        { 
            if(me.height =='auto')
            { 
            }
            else
            {
                me.dom.style.overflowY='auto'; 
            }    
        } 
    },
    /**
     * 
     */ 
    onAfterInit:function onAfterInit() {
        var me = this;
       
        var _fields = (this.formFields && this.formFields.length > 0) ? this.formFields :[];
        
        if(_fields && _fields.length > 0)
        {
            me.loadFormFields();
        }
        this.callParent();
         
        var btns = this.buttons || [];//console.log(btns);
        if(btns.length>0)
        {
            //添加一个占位块
            this.items[1].add({xtype:'component-x',width:100});
        }
      
        for (var i=0;i< btns.length;i++) {
            
            if (Rsd.isString(btns[i])) {
 
                switch (btns[i]) {
                    case 'save':
                        {
                            if (this.readonly !== true) {
                                this.items[1].add({
                                    xtype: 'button',
                                    text: '保 存',
                                    delayMS: 2000,
                                    width: 100,
                                    minWidth: 80,
                                    height: 40,
                                    minHeight: 40,
                                    margin: '2 10 2 5',
                                    handler: '_btn_save'
                                });
                            }
                            break;
                        } 
                    case 'delete':
                        {
                            if (this.readonly !== true) {
                                this.items[1].add({
                                    xtype: 'button',
                                    text: '删 除',
                                    delayMS: 2000,
                                    width: 100,
                                    minWidth: 80,
                                    height: 40,
                                    minHeight: 40,
                                    margin: '2 10 2 5',
                                    handler: '_btn_delete'
                                });
                            }
                            break;
                        } 
                    case 'cancel':
                        {
                            this.items[1].add({
                                xtype: 'button',
                                text: '取 消',
                                width: 100,
                                minWidth: 80,
                                height: 40,
                                minHeight: 40,
                                margin: '2 10 2 5',
                                handler: '_btn_cancel'
                            });
                            break;
                        } 
                }

                continue;
            }

            if (Rsd.isObject(btns[i])) {

                var _btn = Rsd.apply(
                    {
                        xtype: 'button',
                        width: 100,
                        minWidth: 80,
                        height: 40,
                        minHeight: 40,
                        margin: '2 10 2 5'
                    }, btns[i]);

                _btn.__fn = _btn.handler || _btn.onclick || _btn.fn;
               
                _btn.handler = function () {
                    if(!this.__fn)
                    {
                            alert('buttton对象为设置handler');
                            return ;
                    }

                    if (me.items[0].checkRecord() == false) {
                        me.items[0].showError();
                        return;
                    }
                   
                    var _rs = me.funApplyByIOC(this.__fn, [me.items[0].getRecord(), me]);
                    if (_rs === true) {
                        me.close();
                    }
                }
               
                this.items[1].add(_btn);
                continue;
            }

            console.log('error',btns[i]);
        }

        //显示按钮条 
        setTimeout(function () {
            me.items[1].show();
        }, 500);
         
    },
    
    /*
    * */
    load: function load(record) {

        this.items[0].loadData(record||this.data);
    },
    /**
    * 
    */
    onBeforeSaveHandler:function onBeforeSaveHandler(record)
    {
        if(this.onBeforeSave)
        {
            this.funApplyByIOC(this.onBeforeSave, [record,this]);
        }
    },
    /**
     * @description 加载字段,加载完字段，后会自动加载数据
     */
    loadFormFields:function loadFormFields()
    {
        
        var _fields = (this.formFields && this.formFields.length > 0) ? this.formFields :[];
        _fields = _fields || []; 
        if(_fields.length == 0 )
        {
            console.error('没有编辑字段，formFields为空');
            return;
        }

        try {
 
            for (var i in _fields) {
                //_fields[i].required = true;
                if (Rsd.isString(_fields[i].label)) {
                    _fields[i].label = {content: _fields[i].label};
                }
                //统一设置 label 宽度
                if (this.labelWidth && _fields[i].label) {
                    _fields[i].label.width = _fields[i].label.width || this.labelWidth;
                }
                //统一设置 字段宽度
                if (this.fieldWidth) {
                    _fields[i].width = _fields[i].width||this.fieldWidth;
                }
            }
            var mv = this.items[0];
             
            if(_fields.length > 0)
            {
                mv.fields = _fields;
                //console.log('mv is',mv.loadFields);
                if(mv.loadFields)
                {  
                    //加载字段,加载完字段，后会自动加载数据
                    mv.loadFields(); 
                }
               
            } 
            
        } catch (ex) {
            Rsd.error('FormDialog加载模型结构失败', 'Rsd.zen.dialog.FormDialog', ex);
        }
    },
    /**
     * 新增 或 修改对象
     */
    save:function save()
    {
        var me = this;
        var _form =  me.items[0];
        if (_form.checkRecord() == false) {
            _form.showError();
            return false;
        }
 
        var _record = me.record||{};
        _record = Rsd.apply(_record,_form.getRecord());
        if (_record == null) {
            Rsd.msg("数据错误，无法保存。");
            return false;//flase 表示拒绝后续方法的处理
        }
         //
         me.onBeforeSaveHandler(_record);

        //通过form表单的action指定接口 提交
        if(_form.action)
        { 
            _form.submit();
            return false;//flase 表示拒绝后续方法的处理
        }
        //调用 保存方法
        if(me.saveHandler)
        {
            me.funApplyByIOC(me.saveHandler,[_record]);
            return false;//flase 表示拒绝后续方法的处理
        }
        //调用 接口服务 执行保存
        if(me.saveServiceName)
        {
            Rsd.app.getService(me.saveServiceName).request(_record,function(resp){

                if (resp.success) {
                    
                    Rsd.showPopup("保存成功。");
                    return false;//flase 表示拒绝后续拦截方法的处理
                }
                else
                {
                    Rsd.alert('数据保存失败',resp.msg);
                    return false;//flase 表示拒绝后续拦截方法的处理
                }
            });

            return false;
        }
        
        return true;//true 表示拒绝后续方法继续的处理
    },
    /**
     * 仅 修改 指定 字段
     */
    update:function update(dataIndex,value)
    {
        var me = this;
        var _record = {};
         _record[dataIndex] = value;
        //调用 修改方法
        if(me.updateHandler)
        {
            me.funApplyByIOC(me.updateHandler,[_record]);
            return false;//flase 表示拒绝后续方法的处理
        }
        //调用 接口服务 执行修改
        if(me.updateServiceName)
        {
            Rsd.app.getService(me.updateServiceName).request(_record,function(resp){

                if (resp.success) {
                    
                    Rsd.showPopup("保存成功。");
                    return false;//flase 表示拒绝后续拦截方法的处理
                }
                else
                {
                    Rsd.alert('数据保存失败',resp.msg);
                    return false;//flase 表示拒绝后续拦截方法的处理
                }
            });

            return false;
        }
        
        return true;//true 表示拒绝后续方法继续的处理
    },
    /**
     * 
     * @param {*} sender 
     * @param {*} evt 
     */
    _btn_update:function _btn_update(sender,evt)
    { 
        this.update(sender.dataIndex,sender.editor.element.value);
    },
    /**
     * @description 控件绑定事件
     * 
     * */
    _btn_save:function _btn_save() {
        
        this.save();
    },
    _btn_delete:function _btn_delete()
    {
        console.log('未实现业务_btn_delete');
    },
    _btn_cancel:function _btn_cancel()
    {
         console.log('未实现业务_btn_cancel');
    },
    /**
        * 获取字段控件 by name or index 
        *  */
    foucsField: function foucsField(key) {
        if (Rsd.isEmpty(key)) {
            return this;
        }
        var ctrl = this.items[0].getFieldControl(key);
        ctrl && ctrl.focus();

        return this;
    },
    /**
     * 获取字段控件 by name or index 
     */
    getFieldControl: function getFieldControl(key) {

        return this.items[0].getFieldControl(key);
    },
    /*
    * 获取字段控件值 by name or index  
    * */
    getFieldValue: function getFieldControl(key) {

        var ctrl = this.items[0].getFieldControl(key);
        if(ctrl)
        {
            return ctrl.getValue();
        }
        console.error("未找到控件【"+key+"】by name or index"); 
    },
    /*
    * 设置字段值 by name or index  
    * */
    setFieldValue: function (key, value) {
        var ctrl = this.items[0].getFieldControl(key);
        if(ctrl)
        {
            return ctrl.setValue(value);
        } 
        console.error("未找到控件【"+key+"】by name or index"); 
    },

    /*
    * 同步更新数据 将form 控件数据 和 form.data数据同步一致
    * */
    syncData: function syncData() {

        var _form = this.items[0];

        if (_form.checkRecord()) {

            return _form.getRecord(_form.data);

        }
        else {
            _form.showError();
        }
        return _form.data;
    },

    /**
    * @description 获取form数据,验证不通过时 返回null 
    *  
    * */
    getData: function () {
 
        var _form = this.items[0];
        if (_form.checkRecord()) {

            return _form.getRecord();

        } else {
            _form.showError();
        }
        return null;
    }

},function(type){

    var _modelTypeGetter = function () {

        if (Rsd.isEmpty(this.__modelType)) {
            this.__modelType = this.menu.modelType;
        }
        return this.__modelType;
    };
    var _modelTypeSetter = function (value) {

        this.__modelType = value;

    };
    this.defineProperty(type,"modelType", _modelTypeGetter, _modelTypeSetter,false);

    var _readonlyGetter = function () {

        if (this.hasOwnProperty('__readonly') == false) {
            this.__readonly = true;
            this.items[0].readonly = true;
        }
        return this.__readonly;

    };

    var _readonlySetter = function (value) {

        this.__readonly = value;
        this.items[0].readonly = value;
        return;

    };
    this.defineProperty(type, "readonly", _readonlyGetter, _readonlySetter, true);
    //
    var _formGetter = function _formGetter()
    { 
       return this.items[0];
    };

    var _formSetter  =function _formSetter(value)
    { 
       
        if(Rsd.isObject(value))
        {
            Rsd.apply(this.items[0],value);
            return;
        }
        
    }

    this.defineProperty(type,"form", _formGetter, _formSetter,true);
    //
    var _rightGetter = function () {
 
        return this.items[2];
    };
    var _rightSetter = function (value) {

        if(Rsd.isString(value))
        {
            this.items[2].xtype = value
        }
        if(Rsd.isObject(value))
        {
            Rsd.apply(this.items[2],value);
        } 

    };
    this.defineProperty(type,"right", _rightGetter, _rightSetter,false);
});